package Cliente.interface_grafico;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.IOException;
import java.io.ObjectOutputStream;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;

import mensagem.MLeilao;

import jogoKing.leilao.RespostasLeilao;

public class MenuLeilao extends JFrame {

	private SpinnerNumberModel model;
	private JSpinner s_oferta;
	private JComboBox cb_pos_neg;
	private JLabel l_oferta;
	private JButton b_oferecer;
	private JButton b_desistir;
	private JRadioButton rb_sem_trunfo;
	private JRadioButton rb_com_trunfo;
	private ButtonGroup grupo_trunfo;
	private JRadioButton rb_paus;
	private JRadioButton rb_espadas;
	private JRadioButton rb_copas;
	private JRadioButton rb_ouros;
	private ButtonGroup grupo_naipe;
	private IndicadorVazas south;
	private IndicadorVazas west;
	private IndicadorVazas north;
	private IndicadorVazas east;
	private String dono;
	private JButton b_escolhe_trunfo;

	private JButton b_aceitar;
	private JButton b_rejeitar;

	private int oferta_actual;
	private int oferta_minima;
	private boolean oferta_pode_ser_igual;
	private ObjectOutputStream output;
	private int id;
	
	private boolean listener_pode_actuar;

	public MenuLeilao(String[] nomes, ObjectOutputStream out, int id_jogo, boolean dono){
		super("King - Leilao");
		assert (nomes.length==4);

		setSize(550, 400);
		setLocation(300, 200);
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

		this.output = out;
		this.id = id_jogo;
		this.oferta_actual = 0;
		this.south = new IndicadorVazas(nomes[0]);
		this.west = new IndicadorVazas(nomes[1]);
		this.north = new IndicadorVazas(nomes[2]);
		this.east =  new IndicadorVazas(nomes[3]);
		this.dono = "";
		this.oferta_minima = 0;
		this.oferta_pode_ser_igual = true;
		this.listener_pode_actuar = false;

		if(!dono){
			model = new SpinnerNumberModel(0,		//initial value
					0,		//min
					8, 		//max
					1);		//step
			s_oferta = new JSpinner(model);
			cb_pos_neg = new JComboBox();
			cb_pos_neg.addItem(new String("positivo"));
			cb_pos_neg.addItem(new String("negativo"));
			l_oferta = new JLabel("A sua oferta: ");
			b_oferecer = new JButton("oferecer");
			b_desistir = new JButton("desistir");
		}else{
			b_aceitar = new JButton("aceitar");
			b_rejeitar = new JButton("recusar");
		}

		b_escolhe_trunfo = new JButton("escolhe trunfo");
		rb_sem_trunfo = new JRadioButton("sem trunfo");
		rb_com_trunfo = new JRadioButton("com trunfo");
		grupo_trunfo = new ButtonGroup();
		grupo_trunfo.add(rb_sem_trunfo);
		grupo_trunfo.add(rb_com_trunfo);
		rb_com_trunfo.setSelected(true);
		rb_paus = new JRadioButton("Paus");
		rb_paus.setSelected(true);
		rb_espadas = new JRadioButton("Espadas");
		rb_copas = new JRadioButton("Copas");
		rb_ouros = new JRadioButton("Ouros");
		grupo_naipe = new ButtonGroup();
		grupo_naipe.add(rb_paus);
		grupo_naipe.add(rb_espadas);
		grupo_naipe.add(rb_copas);
		grupo_naipe.add(rb_ouros);

		if(!dono){
			b_desistir.setEnabled(false);
			b_oferecer.setEnabled(false);
			s_oferta.setEnabled(false);
			cb_pos_neg.setEnabled(false);

			cb_pos_neg.addItemListener(new ItemListener(){

				@Override
				public void itemStateChanged(ItemEvent ie) {
					if(listener_pode_actuar){
						if(ie.getItem().equals(new String("positivo"))){
							model.setMaximum(8);
							if(oferta_minima < 0){
								model.setMinimum(oferta_minima*-3);
								s_oferta.setValue((Integer)s_oferta.getValue()*3);
								if(!oferta_pode_ser_igual){
									model.setMinimum((oferta_minima*-3) + 1);
									s_oferta.setValue((Integer)s_oferta.getValue()+1);
								}
							}else{
								model.setMinimum(oferta_minima);
								s_oferta.setValue(oferta_minima);
								if(!oferta_pode_ser_igual){
									model.setMinimum(oferta_minima + 1);
									s_oferta.setValue((Integer)s_oferta.getValue()+1);
								}
							}
						}else{
							if((Integer)s_oferta.getValue() >= 3)
								s_oferta.setValue((Integer)s_oferta.getValue()/3);
							if(oferta_minima >= 0){
								model.setMinimum(oferta_minima / 3);
							}else{
								model.setMinimum(oferta_minima * -1);
							}

							if(!oferta_pode_ser_igual){
								if(oferta_minima >= 0){
									model.setMinimum((oferta_minima / 3) + 1);
								}else{
									model.setMinimum((oferta_minima * -1) + 1);
								}
							}

							model.setMaximum(2);
						}
					}
				}
			});
		}else{
			b_aceitar.setEnabled(false);
			b_rejeitar.setEnabled(false);
		}

		ActionListener listener_trunfo = new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				if(rb_sem_trunfo.isSelected()){
					rb_paus.setEnabled(false);
					rb_espadas.setEnabled(false);
					rb_copas.setEnabled(false);
					rb_ouros.setEnabled(false);
				}else{
					rb_paus.setEnabled(true);
					rb_espadas.setEnabled(true);
					rb_copas.setEnabled(true);
					rb_ouros.setEnabled(true);
				}
			}
		};

		rb_sem_trunfo.addActionListener(listener_trunfo);
		rb_com_trunfo.addActionListener(listener_trunfo);

		if(!dono){
			b_oferecer.addActionListener(new ActionListener(){
				@Override
				public void actionPerformed(ActionEvent arg0) {
					b_desistir.setEnabled(false);
					b_oferecer.setEnabled(false);
					s_oferta.setEnabled(false);
					cb_pos_neg.setEnabled(false);

					oferta_actual = (Integer)s_oferta.getValue();
					if(((String)cb_pos_neg.getSelectedItem()).equals("negativo")) oferta_actual *= -1;
					RespostasLeilao resposta = null;
					switch(oferta_actual){
					case -3: resposta = RespostasLeilao.OFERTA_n3;
					break;
					case -2: resposta = RespostasLeilao.OFERTA_n2;
					break;
					case -1: resposta = RespostasLeilao.OFERTA_n1;
					break;
					case 1: resposta = RespostasLeilao.OFERTA_1;
					break;
					case 2: resposta = RespostasLeilao.OFERTA_2;
					break;
					case 3: resposta = RespostasLeilao.OFERTA_3;
					break;
					case 4: resposta = RespostasLeilao.OFERTA_4;
					break;
					case 5: resposta = RespostasLeilao.OFERTA_5;
					break;
					case 6: resposta = RespostasLeilao.OFERTA_6;
					break;
					case 7: resposta = RespostasLeilao.OFERTA_7;
					break;
					case 8: resposta = RespostasLeilao.OFERTA_8;
					break;
					default: resposta = RespostasLeilao.OFERTA_0;
					break;
					}
					try {
						synchronized(output){
							output.writeObject(new MLeilao(id, resposta));
						}
					} catch (IOException e) {}
				}
			});

			b_desistir.addActionListener(new ActionListener(){
				@Override
				public void actionPerformed(ActionEvent arg0) {
					b_desistir.setEnabled(false);
					b_oferecer.setEnabled(false);
					s_oferta.setEnabled(false);
					cb_pos_neg.setEnabled(false);

					try {
						synchronized(output){
							output.writeObject(new MLeilao(id, RespostasLeilao.OFERTA_0));
						}
					} catch (IOException e) {}
				}
			});
		}else{
			b_aceitar.addActionListener(new ActionListener(){
				@Override
				public void actionPerformed(ActionEvent arg0) {
					b_rejeitar.setEnabled(false);
					b_aceitar.setEnabled(false);
					try {
						synchronized(output){
							output.writeObject(new MLeilao(id, RespostasLeilao.ACEITA_OFERTA));
						}
					} catch (IOException e) {}
				}
			});
			
			b_rejeitar.addActionListener(new ActionListener(){
				@Override
				public void actionPerformed(ActionEvent arg0) {
					b_rejeitar.setEnabled(false);
					b_aceitar.setEnabled(false);
					try {
						synchronized(output){
							output.writeObject(new MLeilao(id, RespostasLeilao.RECUSA_OFERTA));
						}
					} catch (IOException e) {}
				}
			});
		}
		
		b_escolhe_trunfo.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				RespostasLeilao resposta = null;
				if(rb_sem_trunfo.isSelected()){
						resposta = RespostasLeilao.SEM_TRUNFO;
				}else{
					if(rb_paus.isSelected()){
						resposta = RespostasLeilao.TRUNFO_PAUS;
					}else if(rb_espadas.isSelected()){
						resposta = RespostasLeilao.TRUNFO_ESPADAS;
					}else if(rb_copas.isSelected()){
						resposta = RespostasLeilao.TRUNFO_COPAS;
					}else if(rb_ouros.isSelected()){
						resposta = RespostasLeilao.TRUNFO_OUROS;
					}
				}
				try {
				synchronized(output){
					output.writeObject(new MLeilao(id, resposta));
					output.flush();
				}
			} catch (IOException e) {}
			}
		});

		Container cp = this.getContentPane();
		cp.setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();

		JPanel painel1 = new JPanel();
		painel1.setLayout(new BorderLayout());
		painel1.add(this.south, BorderLayout.SOUTH);
		painel1.add(this.west, BorderLayout.WEST);
		painel1.add(this.north, BorderLayout.NORTH);
		painel1.add(this.east, BorderLayout.EAST);

		c.gridx = 0;
		c.gridy = 0;
		c.weightx = 1.0;
		c.weighty = 1.0;
		c.fill = GridBagConstraints.BOTH;
		cp.add(painel1, c);

		if(!dono){
			JPanel painel2 = new JPanel();
			painel2.setLayout(new FlowLayout());
			painel2.add(l_oferta);
			painel2.add(s_oferta);
			painel2.add(cb_pos_neg);
			painel2.add(b_oferecer);
			painel2.add(b_desistir);

			c.gridy = 1;
			c.weightx = 0.0;
			c.weighty = 0.0;
			c.fill = GridBagConstraints.NONE;
			cp.add(painel2, c);
		}else{
			JPanel painel2 = new JPanel();
			painel2.setLayout(new FlowLayout());
			painel2.add(b_aceitar);
			painel2.add(b_rejeitar);

			c.gridy = 1;
			c.weightx = 0.0;
			c.weighty = 0.0;
			c.fill = GridBagConstraints.NONE;
			cp.add(painel2, c);
		}
		
		JPanel painel3 = new JPanel();
		painel3.add(rb_sem_trunfo);
		painel3.add(rb_com_trunfo);
		painel3.add(rb_paus);
		painel3.add(rb_espadas);
		painel3.add(rb_copas);
		painel3.add(rb_ouros);
		painel3.add(this.b_escolhe_trunfo);
		
		c.gridy = 2;
		cp.add(painel3, c);
		
		rb_sem_trunfo.setVisible(false);
		rb_com_trunfo.setVisible(false);
		rb_paus.setVisible(false);
		rb_espadas.setVisible(false);
		rb_copas.setVisible(false);
		rb_ouros.setVisible(false);
		b_escolhe_trunfo.setVisible(false);
	}

	public void pedeOferta(){
		b_oferecer.setEnabled(true);
		b_desistir.setEnabled(true);
	}

	public void setOferta(String nome, int valor){
		assert (valor >= -3 && valor <= 8);
		this.oferta_actual = valor;

		if(this.south.getNome().equals(nome)){
			this.south.setValor(valor);
		}else if(this.west.getNome().equals(nome)){
			this.west.setValor(valor);
		}else if(this.north.getNome().equals(nome)){
			this.north.setValor(valor);
		}else if(this.east.getNome().equals(nome)){
			this.east.setValor(valor);
		}
	}

	public void setDono(String nome) {
		dono = nome;

		java.net.URL imageURL = MenuLeilao.class.getResource("/leilao/dono.png");
		if(this.south.getNome().equals(nome)){
			if (imageURL != null) {
				this.south.setIcon(new ImageIcon(imageURL));
			}
		}else if(this.west.getNome().equals(nome)){
			if (imageURL != null) {
				this.west.setIcon(new ImageIcon(imageURL));
			}
		}else if(this.north.getNome().equals(nome)){
			if (imageURL != null) {
				this.north.setIcon(new ImageIcon(imageURL));
			}
		}else if(this.east.getNome().equals(nome)){
			if (imageURL != null) {
				this.east.setIcon(new ImageIcon(imageURL));
			}
		}
	}

	public void escolheTrunfo() {
		rb_sem_trunfo.setVisible(true);
		rb_com_trunfo.setVisible(true);
		rb_paus.setVisible(true);
		rb_espadas.setVisible(true);
		rb_copas.setVisible(true);
		rb_ouros.setVisible(true);
		b_escolhe_trunfo.setVisible(true);
	}

	public void aceitaOferta(int valor) {
		b_aceitar.setEnabled(true);
		b_rejeitar.setEnabled(true);
	}

	public void aumentaOferta(int valor, boolean pode_ser_igual) {
		listener_pode_actuar = false;
		this.l_oferta.setText("A sua oferta: ");
		if(pode_ser_igual)
			this.l_oferta.setText("A sua oferta (pode ser igual): ");
		this.oferta_minima = valor;
		this.oferta_pode_ser_igual = pode_ser_igual;
		
		if(valor<0){
			s_oferta.setValue(valor * -1);
			cb_pos_neg.setSelectedItem("negativo");
			model.setMinimum(valor * -1);
		}else if(valor>0){
			s_oferta.setValue(valor);
			cb_pos_neg.setSelectedItem("positivo");
			model.setMinimum(valor * -1);
		}
			
		if(!pode_ser_igual){
			if(valor<0 && ((valor * -3) + 1) <= 8){
				s_oferta.setValue((valor * -3) + 1);
				cb_pos_neg.setSelectedItem("positivo");
				model.setMinimum((valor * -3) + 1);
			}else if(valor>=0 && (valor + 1) <= 8){
				s_oferta.setValue(valor + 1);
				model.setMinimum(valor + 1);
			}else{
				try {
					synchronized(output){
						output.writeObject(new MLeilao(id, RespostasLeilao.OFERTA_0));
					}
				} catch (IOException e) {}
				listener_pode_actuar = true;
				return;
			}
			
			if((Integer)s_oferta.getValue() >= 7){
				this.b_desistir.setEnabled(true);
				this.b_oferecer.setEnabled(true);
				this.s_oferta.setEnabled(true);
				this.cb_pos_neg.setEnabled(false);
				listener_pode_actuar = true;
				return;
			}
		}
		
		this.b_desistir.setEnabled(true);
		this.b_oferecer.setEnabled(true);
		this.s_oferta.setEnabled(true);
		this.cb_pos_neg.setEnabled(true);
		
		listener_pode_actuar = true;
	}

	public void setQuemOferece(String nome) {
		if(this.south.getNome().equals(nome)){
			this.south.setFont(new Font("Arial Bold", Font.BOLD, 16));
			this.west.setFont(new Font("Arial", Font.PLAIN, 16));
			this.north.setFont(new Font("Arial", Font.PLAIN, 16));
			this.east.setFont(new Font("Arial", Font.PLAIN, 16));
		}else if(this.west.getNome().equals(nome)){
			this.south.setFont(new Font("Arial", Font.PLAIN, 16));
			this.west.setFont(new Font("Arial Bold", Font.BOLD, 16));
			this.north.setFont(new Font("Arial", Font.PLAIN, 16));
			this.east.setFont(new Font("Arial", Font.PLAIN, 16));
		}else if(this.north.getNome().equals(nome)){
			this.south.setFont(new Font("Arial", Font.PLAIN, 16));
			this.west.setFont(new Font("Arial", Font.PLAIN, 16));
			this.north.setFont(new Font("Arial Bold", Font.BOLD, 16));
			this.east.setFont(new Font("Arial", Font.PLAIN, 16));
		}else if(this.east.getNome().equals(nome)){
			this.south.setFont(new Font("Arial", Font.PLAIN, 16));
			this.west.setFont(new Font("Arial", Font.PLAIN, 16));
			this.north.setFont(new Font("Arial", Font.PLAIN, 16));
			this.east.setFont(new Font("Arial Bold", Font.BOLD, 16));
		}
	}

	private class IndicadorVazas extends JLabel{

		private int valor;

		public IndicadorVazas(String nome) {
			super(nome, null, JLabel.CENTER);
			this.setVerticalTextPosition(JLabel.TOP);
			this.setHorizontalTextPosition(JLabel.CENTER);
			valor = 0;
		}

		public int getValor() {
			return valor;
		}

		public void setValor(int valor) {
			assert (valor >= -3 && valor <= 8);
			this.valor = valor;
			if(!this.getText().equals(dono)){
				java.net.URL imageURL = MenuLeilao.class.getResource("/leilao/"+valor+".png");
				if (imageURL != null) {
					this.setIcon(new ImageIcon(imageURL));
				}
			}
		}

		public String getNome() {
			return this.getText();
		}
	}
}
